package com.kashow.api;

import com.google.gson.JsonObject;
import com.kashow.bean.SimpleHttpResult;
import com.kashow.bean.albums.AlbumsDetailBeanResult;
import com.kashow.bean.albums.AlbumsResult;
import com.kashow.bean.albums.albumslist.AlbumsListResult;
import com.kashow.bean.chat.gift.GiftResult;
import com.kashow.bean.circle.CircleResult;
import com.kashow.bean.circle.CirclesResult;
import com.kashow.bean.circle.audiio.RecordAudioResult;
import com.kashow.bean.circle.collect.CollectionResult;
import com.kashow.bean.circle.music.MusicResult;
import com.kashow.bean.comment.CommentResult;
import com.kashow.bean.live.category.CategoryLiveResult;
import com.kashow.bean.live.choice.ChoicesLiveResult;
import com.kashow.bean.live.detail.LiveDetailResult;
import com.kashow.bean.live.follows.FollowsLiveResult;
import com.kashow.bean.live.invite.LiveInviteResult;
import com.kashow.bean.live.invite.MyInviteResult;
import com.kashow.bean.live.preshow.PreShowLiveResult;
import com.kashow.bean.live.push.PushResult;
import com.kashow.bean.login.WeiXinBeanResult;
import com.kashow.bean.message.official.OfficialResult;
import com.kashow.bean.message.star.StarResult;
import com.kashow.bean.message.unread.UnReadResult;
import com.kashow.bean.pay.OrderResult;
import com.kashow.bean.register.PhoneCodeBean;
import com.kashow.bean.register.RegisterBean;
import com.kashow.bean.slide.SlideResult;
import com.kashow.bean.supersearch.SuperSearchResult;
import com.kashow.bean.supersearch.living.SearchLiveResult;
import com.kashow.bean.supersearch.users.SearchUsersResult;
import com.kashow.bean.teacher.TeacherHistoryResult;
import com.kashow.bean.teacher.allanswers.AllAnswersListResult;
import com.kashow.bean.teacher.homeworkdetail.HomeworkDetailResult;
import com.kashow.bean.teacher.homeworklist.HomeworkListResult;
import com.kashow.bean.teacher.teachercircle.TeacherCircleResult;
import com.kashow.bean.teacher.teachergenius.TeacherGeniusResult;
import com.kashow.bean.token.TokenResult;
import com.kashow.bean.user.UserResult;
import com.kashow.bean.user.auth.AuthUserResult;
import com.kashow.bean.user.buyed.BuyedLiveResult;
import com.kashow.bean.user.publish.PublishLiveResult;
import com.kashow.bean.user.publish.course.CourseResult;
import com.kashow.bean.user.recharge.RechargeResult;
import com.kashow.bean.user.reserve.ReserveLiveResult;
import com.kashow.bean.user.teacher.TeacherBeanResult;
import com.kashow.bean.user.update.UpdateBean;

import java.util.Map;

import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
import rx.Observable;


public interface ApiService {
    @GET("/api/live/playurl/{playCode}")
    Observable<JsonObject> getPlayUrl(@Path("playCode") String playCode);
    //path 对{} 里面内容进行替换

    /***
     * 获取关注列表
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/lives/follow")
    Observable<FollowsLiveResult> getFollowsLive(@Query("page") int page, @Query("limit") int limit);
    //拼接的两个参数

    /***
     * 获取精选列表
     *
     * @param size
     * @return
     */
    @GET("/api/lives/_choice")
    Observable<ChoicesLiveResult> getChoicesLive(@Query("size") int size);

    /***
     * 获取分类列表
     *
     * @param categoryId
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/lives/_category/{categoryId}")
    Observable<CategoryLiveResult> getCategoryLive(@Path("categoryId") int categoryId, @Query("page") int page, @Query("limit") int limit);
    //path : 路径对{} 里面内容进行替换,后面一次拼接参数.  Query 查询


    /***
     * 获取分类列表
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/lives/_category/hots")
    Observable<CategoryLiveResult> getHotLive(@Query("page") int page, @Query("limit") int limit);
    //path : 路径对{} 里面内容进行替换,后面一次拼接参数.  Query 查询


    /***
     * 获取分类下所有的直播
     *categoryId
     *  直播状态 1预约中 2正在直播 3已结束
     *
     *
     * @param categoryId
     * @param page
     * @param limit
     * @param q string (optional) 筛选(teacherName/title/desc)
     * @param sort 1/-1 排序
     * @return
     */
    @GET("/api/lives/category/{categoryId}")
    Observable<CategoryLiveResult> getCategoryLive(
            @Path("categoryId") int categoryId,
            @Query("page") int page, @Query("limit") int limit
            , @Query("sort") int sort, @Query("q") String q);


    /***
     * 获取预播
     */
    @GET("/api/lives/pre")
    Observable<PreShowLiveResult> getPreShowLive(@Query("page") int page, @Query("limit") int limit);


    /***
     * 获取主页的订阅专栏
     */
    @GET("/api/albums")
    Observable<AlbumsResult> getAlbums(@Query("page") int page, @Query("limit") int limit);

    /***
     * 获取预播指定老师的订阅专栏
     */
    @GET("/api/albums")
    Observable<AlbumsResult> getAlbumsTeacher(@Query("page") int page, @Query("limit") int limit, @Query("teacherId") int teacherId);

    /****
     * 获取未读消息
     *
     * @return
     */
    @GET("/api/message/unread")
    Observable<com.kashow.bean.unread.UnReadResult> getUnRead();

    /***
     * 获取用户自己的信息
     *
     * @return
     */
    @GET("/api/user")
    Observable<UserResult> getUserResult();

    /***
     * 获取直播评论
     *
     * @param liveId
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/live/{liveId}/comments")
    Observable<CommentResult> getLiveComments(@Path("liveId") int liveId, @Query("page") int page, @Query("limit") int limit);

    /***
     * 获取直播详情
     *
     * @param liveId
     * @return
     */
    @GET("/api/live/{liveId}")
    Observable<LiveDetailResult> getLiveDetail(@Path("liveId") int liveId);

    /****
     * 获取预约列表
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/reserves")
    Observable<ReserveLiveResult> getUserReserveLive(@Query("date") String date, @Query("page") int page, @Query("limit") int limit);

    /***
     * 获取购买列表
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/user/buy/live")
    Observable<BuyedLiveResult> getUserBuyLive(@Query("page") int page, @Query("limit") int limit);


    @GET("/api/live/user")
    Observable<PublishLiveResult> getUserPublishLive(@Query("page") int page, @Query("limit") int limit);


    @GET("/api/live/user/{user}")
    Observable<TeacherHistoryResult> getUserPublishLiveById(@Path("user") int user, @Query("page") int page, @Query("limit") int limit);

    /****
     * 登录
     *
     * @param phone
     * @param code
     * @return
     */
    @GET("/api/user/login")
    Observable<UserResult> login(@Query("phone") String phone, @Query("password") String password, @Query("code") String code);

    /****
     * 登录
     *
     * @param phone
     * @return
     */
    @GET("/api/user/login")
    Observable<UserResult> normalogin(@Query("phone") String phone, @Query("password") String password);

    /****
     * 获取评论消息
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/message/comment")
    Observable<com.kashow.bean.message.comment.CommentResult> getComments(@Query("page") int page, @Query("limit") int limit);


    /****
     * 搜索直播
     *
     * @param q
     * @param limit 完全搜索时,不需要该字段
     * @param page  完全搜索时,不需要该字段
     *              直播状态 1预约中 2正在直播 3已结束
     * @return
     */
    @GET("/api/live/search")
    Observable<SearchLiveResult> getSearchLive(@Query("q") String q,
                                               @Query("limit") int limit,
                                               @Query("page") int page,
                                               @Query("status") int status);


    /****
     * 搜索用户
     *
     * @param q     筛选字段
     * @param limit 每页的大小
     * @param page
     * @return
     */
    @GET("/api/users/search")
    Observable<SearchUsersResult> getSearchUsers(@Query("q") String q,
                                                 @Query("page") int page,
                                                 @Query("limit") int limit);


    /****
     * 搜索全部信息
     *
     * @param q
     * @return
     */
    @GET("/api/live/search")
    Observable<SuperSearchResult> getSearch(@Query("q") String q);


//     /****
//     * 搜索全部信息
//     * @param q
//     * @return
//     */
//    @GET("/api/live/search")
//    Observable<SuperSearchResult> getSearchUsers(@Query("q") String q);
//


    /***
     * 获取关注信息
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/message/star")
    Observable<StarResult> getStars(@Query("page") int page, @Query("limit") int limit);

    /***
     * 获取官方消息
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/message/official")
    Observable<OfficialResult> getOfficials(@Query("page") int page, @Query("limit") int limit);

    /***
     * 个人私信未读
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/message/personal/room")
    Observable<UnReadResult> getPersonalList(@Query("page") int page, @Query("limit") int limit);

    /****
     * 获取某个人的直播消息
     *
     * @param room
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/message/personal/{room}")
    Observable<OfficialResult> getPersonalMessage(@Path("room") int room, @Query("page") int page, @Query("limit") int limit);

    /***
     * 充值列表
     *
     * @return
     */
    @GET("/api/order/recharge")
    Observable<RechargeResult> getRecharge();

    /***
     * 获取礼物列表
     *
     * @return
     */
    @GET("/api/gift")
    Observable<GiftResult> getGifts();

    /***
     * 送礼物
     */
    @POST("/api/gift")
    @FormUrlEncoded
    Observable<SimpleHttpResult> sendGift(@Field("live") int liveId, @Field("gift") int giftId);
    //对后台来说,就是向数据库表中写文件


//    @Headers({"Content-Type: application/json"})
//    Observable<SimpleHttpResult> publishCircle(@Body RequestBody requestBody);

    /***
     * 绑定手机号
     */
    @POST("/api/user/bind")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> bindPhone(@Body RequestBody requestBody);
    //写入json 数据

    /***
     * 直播点赞
     *
     * @param liveId
     * @return
     */
    @GET("/api/live/{liveId}/star")
    Observable<SimpleHttpResult> starLive(@Path("liveId") int liveId);

    /***
     * 预约直播
     *
     * @return
     */
    @POST("/api/reserve")
    @FormUrlEncoded
    Observable<SimpleHttpResult> reserveLive(@Field("liveId") int liveId);
    //表单提交

    /***
     * 取消预约直播
     *
     * @param
     * @return
     */
    @PUT("/api/reserve/{liveId}")
    Observable<SimpleHttpResult> unReserveLive(@Path("liveId") int liveId);
    //修改数据库内容

    /***
     * 删除预约
     *
     * @param liveId
     * @return
     */
    @DELETE("/api/reserve/{liveId}")
    Observable<SimpleHttpResult> deleteReserve(@Path("liveId") int liveId);
    //逻辑删除

    //type": "消息类型 1. official 2.comment 3.star 4.person"}
    @POST("/api/message/read")
    @FormUrlEncoded
    Observable<SimpleHttpResult> readMessage(@Field("type") int type, @Field("message") int message);


    @GET("/api/spreads/{liveId}")
    Observable<LiveInviteResult> getLiveInvite(@Path("liveId") int liveId, @Query("page") int page, @Query("limit") int limit);


    @GET("/api/spread/{liveId}")
    Observable<MyInviteResult> getMyInviteResult(@Path("liveId") int liveId);


    @PUT("/api/live/{liveId}")
    @FormUrlEncoded
    Observable<SimpleHttpResult> changeLiveStatus(@Path("liveId") int liveId, @Field("status") int liveStatus);

    @POST("/api/user/follow")
    @FormUrlEncoded
    Observable<SimpleHttpResult> followUser(@Field("follow") int userId);

    @DELETE("/api/user/follow/{follow}")
    Observable<SimpleHttpResult> unFollowUser(@Path("follow") int userId);

//    @POST("/user")
//    @FormUrlEncoded
//    Observable<> register()

    /****
     * 获取轮播图
     *
     * @param type
     * @return
     */
    @GET("/api/slides")
    Observable<SlideResult> getSlideByType(@Query("type") String type);


    /**
     * 获取注册的时候的验证码
     *
     * @param phone
     * @return
     */
    @GET("/api/user/{phone}/register")
    Observable<PhoneCodeBean> getCoder(@Path("phone") String phone);


    /**
     * 注册用户
     *
     * @param params
     * @return
     */
    @POST("/api/user")
    @FormUrlEncoded
    Observable<RegisterBean> registerUser(@FieldMap Map<String, String> params);

    /***
     * 获取分类列表
     *
     * @param typeId
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/circles")
    Observable<CirclesResult> getCirclesResult(@Query("type") int typeId, @Query("page") int page, @Query("limit") int limit);

    @GET("/api/circle/user/{userId}")
    Observable<CirclesResult> getPublishedCircle(@Path("userId") int userId, @Query("page") int page, @Query("limit") int limit);


    @DELETE("/api/circle/{circleId}")
    Observable<SimpleHttpResult> deletePublishedCircle(@Path("circleId") int circleId);

    /***
     * 获取圈子信息
     *
     * @param circleId
     * @return
     */
    @GET("/api/circle/{circleId}")
    Observable<CircleResult> getCircleResult(@Path("circleId") int circleId);

    /***
     * 根据用户id获取其咨询
     *
     * @param userId
     * @return
     */
    @GET("/api/circle/user/{userId}")
    Observable<TeacherCircleResult> getTeacherCircleResult(@Path("userId") int userId,
                                                           @Query("page") int page,
                                                           @Query("limit") int limit);

    /***
     * 获取图片Token
     *
     * @return
     */
    @GET("/api/qiniu/token")
    Observable<TokenResult> getQiniuImageToken();

    /***
     * 获取音视频Token
     *
     * @return
     */
    @GET("/api/qiniu/media_token")
    Observable<TokenResult> getQiniuMediaToken();

    /****
     * 发布圈子
     *
     * @param requestBody
     * @return
     */
    @POST("/api/circle")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> publishCircle(@Body RequestBody requestBody);

    @POST("/api/live")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> publishLiving(@Body RequestBody requestBody);

    @POST("/api/inform")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> report(@Body RequestBody requestBody);

    /****
     * 获取音乐
     *
     * @return
     */
    @GET("/api/musicTags/musics")
    Observable<MusicResult> getMusicList();


    @POST("/api/user/auth")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> auth(@Body RequestBody requestBody);


    @GET("/api/user/auth")
    Observable<AuthUserResult> auth();


    @POST("/api/record")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> uploadRecord(@Body RequestBody requestBody);


    @GET("/api/records")
    Observable<RecordAudioResult> getRecords(@Query("page") int page, @Query("limit") int limit);


    /**
     * 获取课程列表
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/live/list")
    Observable<CourseResult> getourse(@Query("page") int page, @Query("limit") int limit);


    /***
     * 删除z直播
     *
     * @param liveId
     * @return
     */
    @DELETE("/api/live/{liveId}")
    Observable<SimpleHttpResult> deletePublicLiving(@Path("liveId") int liveId);

    /**
     * 微信授权登录
     *
     * @param code
     * @return
     */
    @GET("/api/user/login/wechat")
    Observable<WeiXinBeanResult> loginByWechat(@Query("code") String code);


    @GET("/api/circle/collects")
    Observable<CollectionResult> getCollects(@Query("page") int page, @Query("limit") int limit);


    /**
     * 上传收藏
     *
     * @param circleId
     * @return
     */
    @POST("/api/circle/collect/{circleId}")
    Observable<SimpleHttpResult> collectCircle(@Path("circleId") int circleId);


    /**
     * 取消收藏
     *
     * @param circleId
     * @return
     */
    @PUT("/api/circle/collect/{circleId}")
    Observable<SimpleHttpResult> cancleCollect(@Path("circleId") int circleId);

    /**
     * 重新设置密码
     */
    @PUT("/api/user/password")
    @FormUrlEncoded
    Observable<SimpleHttpResult> changePassword(@Field("password") String password);

    /**
     * 验证验证的正确与否
     *
     * @param params
     * @return
     */
    @POST("/api/user/password/vertifyCode")
    @FormUrlEncoded
    Observable<SimpleHttpResult> vertifyCode(@FieldMap Map<String, String> params);

    /**
     * 获取登录的时候的验证码 type =1 表示修改密码时的处理
     *
     * @param phone
     * @return
     */
    @GET("/api/user/{phone}/code")
    Observable<SimpleHttpResult> getLoginCoder(@Path("phone") String phone, @Query("type") int type);

    /**
     * 获取某人的用户信息
     *
     * @param userID
     * @return
     */
    @GET("/api/user/{userID}")
    Observable<TeacherBeanResult> getTeacherInformation(@Path("userID") int userID);

    /**
     * 获取一个专栏下面的视频
     *
     * @return
     */
    @GET("/api/album/resources")
    Observable<AlbumsListResult> getAlbumList(
            @Query("albumId") int albumId,
            @Query("page") int page,
            @Query("limit") int limit);

    /**
     * 获取专栏的详细信息
     *
     * @param
     * @return
     */
    @GET("/api/album/{albumId}")
    Observable<AlbumsDetailBeanResult> getAlbumDetail(@Path("albumId") int albumId);


    /**
     * 上传老师的评论
     */
    @POST("/api/live/{liveId}/comment")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> commentTeacher(@Path("liveId") int liveId, @Body RequestBody requestBody);

    /**
     * 退出登录
     */
    @POST("/api/user/logout")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> logOut();

    /**
     * 提现申请 @Body RequestBody requestBody
     */
    @POST("/api/withdraw")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> withdraw(@Body RequestBody requestBody);


    /**
     * 免费试看
     */
    @POST("/api/free")
    @FormUrlEncoded
    Observable<SimpleHttpResult> free(@Field("live") int liveId);
// api/updata/android



    @POST("/api/pingpp/android/charge")
    @Headers({"Content-Type: application/json"})
    Observable<OrderResult> createOrder(@Body RequestBody requestBody);

    @PUT("/api/user")
    @Headers({"Content-Type: application/json"})
    Observable<SimpleHttpResult> changeUser(@Body RequestBody requestBody);

    @GET("/api/live/publish/{liveId}")
    Observable<PushResult> getPushUrl(@Path("liveId") int liveId, @Query("liveType") int liveType);

    /**
     * 检查更新
     * @return
     */
    @GET("/api/update/android")
    Observable<UpdateBean> getUpdata();

    /**
     * 获取购买列表
     * @return
     */
    @GET("/api/albums/buyed")
    Observable<AlbumsListResult> getAlbumsBuys( @Query("page") int page,
                                                @Query("limit") int limit);

    @POST("/api/live/comment/{commentId}")
    Observable<SimpleHttpResult> replyLiveComment(@Path("commentId") int commentId, @Body RequestBody requestBody);

    @GET("/api/circle/thumb/pic/{circleId}")
    Observable<JsonObject> getPosterUrl(@Path("circleId") int id);

    @POST("/api/spread")
    @FormUrlEncoded
    Observable<SimpleHttpResult> spread(@Field("live") int id, @Field("fromUser") int user, @Field("type") int type);


    /**
     * 获取天才圈内容
     *
     * @param uId
     * @param i
     * @param maxValue
     * @return
     */
    @GET("/api/live")
    Observable<TeacherGeniusResult> getGeniusCircle(int uId, int i, int maxValue);

    Observable<HomeworkListResult> getHomeworkList(int uId, int i, int maxValue);


    /**
     * 获取单个直播所有的问题列表
     *
     * @param liveId
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/live/works/{liveId}")
    Observable<HomeworkListResult> getLiveHomework(@Path("liveId") int liveId, @Query("page") int page, @Query("limit") int limit);


    /**
     * 获取单个用户的所有问题列表
     *
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/live/work/lives")
    Observable<TeacherGeniusResult> getAllLiveHomework(@Query("page") int page, @Query("limit") int limit, @Query("userId") int userId);


    /**
     * 添加一个作业
     *
     * @param requestBody
     * @return
     */
    @POST("/api/live/work")
    Observable<SimpleHttpResult> addHomework(@Body RequestBody requestBody);

    /**
     * 修改一个作业
     *
     * @param workId
     * @param requestBody
     * @return
     */
    @PUT("/api/live/work/{workId}")
    Observable<SimpleHttpResult> editHomework(@Path("workId") int workId, @Body RequestBody requestBody);


    /**
     * 删除一个作业
     *
     * @param workId
     * @return
     */
    @DELETE("/api/live/work/{workId}")
    Observable<SimpleHttpResult> deletHomework(@Path("workId") int workId);

    /**
     * 获取一个作业的详情页面
     *
     * @param workId
     * @return
     */
    @GET("/api/live/work/{workId}")
    Observable<HomeworkDetailResult> getHomewokeDetail(@Path("workId") int workId);


    /**
     * 学生提交一个问题的答案
     *
     * @param requestBody
     * @return
     */
    @POST("/api/live/work/answer")
    Observable<SimpleHttpResult> studentAnswerHomework(@Body RequestBody requestBody);

    /**
     * 老师回答学生问题
     *
     * @param requestBody
     * @return
     */
    @POST("/api/live/work/answer/")
    Observable<SimpleHttpResult> teacherAnswerHomework(@Body RequestBody requestBody);

    /**
     * 老师回答某个学生的问题
     *
     * @param requestBody
     * @return
     */
    @PUT("/api/live/work/answer/{answerId}")
    Observable<SimpleHttpResult> teacherAnswerOne(@Path("answerId") int workId, @Body RequestBody requestBody);


    /**
     * 获取某个问题下的全部回答
     *
     * @param workId
     * @param page
     * @param limit
     * @return
     */
    @GET("/api/live/work/answers")
    Observable<AllAnswersListResult> getAllAnswers(@Query("workId") int workId, @Query("page") int page, @Query("limit") int limit);
}
